`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/04/10 21:14:47
// Design Name: 
// Module Name: seg
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module seg(
    input clk,
    input rst,
    output reg [7:0] seg,
    output reg [7:0] sel,
    input [31:0] seg_buff
    );


    parameter SEG_MAX = 20'd50_000;

    parameter DIG0 = 8'hc0;
    parameter DIG1 = 8'hf9;
    parameter DIG2 = 8'ha4;
    parameter DIG3 = 8'hb0;
    parameter DIG4 = 8'h99;
    parameter DIG5 = 8'h92;
    parameter DIG6 = 8'h82;
    parameter DIG7 = 8'hf8;
    parameter DIG8 = 8'h80;
    parameter DIG9 = 8'h90;
    parameter XIMIE = 8'hff;
    parameter CHAR_P = 8'h8c;
    parameter HENGXIAN = 8'hbf;

    reg [19:0] seg_cnt;
    reg [7:0] seg_bcd;
    reg [3:0] bits;
    always @(posedge clk or posedge rst)           
    begin                                        
        if(rst)begin
            seg_cnt <= 0;
        end else begin
            if(seg_cnt == SEG_MAX - 1)
                seg_cnt <= 0;
            else
                seg_cnt <= seg_cnt + 1;
        end                                     
    end   
    
    always @(posedge clk or posedge rst)      
    begin                                        
        if(rst)begin
            sel <= 0;
            seg_bcd <= 0;
        end else begin
            if(seg_cnt == SEG_MAX - 1)begin
                if(bits == 8)
                    bits <= 0;
                else 
                    bits <= bits + 1;
                case(bits)
                    0:begin sel <= 8'b1111_1110;seg_bcd <= seg_buff[31:28]; end
                    1:begin sel <= 8'b1111_1101;seg_bcd <= seg_buff[27:24]; end
                    2:begin sel <= 8'b1111_1011;seg_bcd <= seg_buff[23:20]; end
                    3:begin sel <= 8'b1111_0111;seg_bcd <= seg_buff[19:16]; end
                    4:begin sel <= 8'b1110_1111;seg_bcd <= seg_buff[15:12]; end
                    5:begin sel <= 8'b1101_1111;seg_bcd <= seg_buff[11:8]; end
                    6:begin sel <= 8'b1011_1111;seg_bcd <= seg_buff[7:4]; end
                    7:begin sel <= 8'b0111_1111;seg_bcd <= seg_buff[3:0]; end
                    default:sel <= 8'b1111_1111;
                endcase
            end
        end
    end
    always @(posedge clk or posedge rst)      
    begin                                        
        if(rst)begin
            seg <= XIMIE;
        end else begin
            case(seg_bcd)
                0: seg <= DIG0;
                1: seg <= DIG1;
                2: seg <= DIG2;
                3: seg <= DIG3;
                4: seg <= DIG4;
                5: seg <= DIG5;
                6: seg <= DIG6;
                7: seg <= DIG7;
                8: seg <= DIG8;
                9: seg <= DIG9;
                10: seg <= XIMIE;
                11: seg <= CHAR_P;
                12: seg <= HENGXIAN;
                default: seg <= XIMIE;
            endcase
        end
    end

endmodule
